home *** CD-ROM | disk | FTP | other *** search
/ PC Answers 2003 September / PC Answers September 2003.iso / Software / trial / MonitorIT 5.2.06 / monitorit_fullsetup.exe / data1.cab / Rpm / ViewCharts.asp < prev    next >
Encoding:
Text File  |  2003-06-24  |  58.1 KB  |  1,407 lines

  1. <html>
  2.  
  3. <head>
  4. <META name=VI60_DTCScriptingPlatform content="Client (IE 4.0 DHTML)">
  5. <META name=VI60_defaultClientScript content=JavaScript>
  6. <title>CounterWatch Graphs</title>
  7. <link rel="stylesheet" type="text/css" href="css/rpmstyle.css">
  8.  
  9. <style>
  10. .WarningStyle { border: solid thin ; overflow:none; background-color:activeborder; width:550; height:50}
  11. .WarningStyle { border-top-color:white; border-left-color:white; border-bottom-color:graytext; border-right-color:graytext;  }
  12.  
  13. #MainDiv { background-color:activeborder; border:none; overflow:none; position:absolute; margin:0; height:100%; width:100% }
  14.  
  15. #ButtonDiv { height:60px; background-color:activeborder; border:solid 1px graytext; border-top-color:graytext; overflow:none; position:absolute; margin:0; width:100%; top:480; visibility:hidden}
  16.  
  17. .ChartStyle { border:solid 1px  blue; overflow:none; position:absolute; background-color:white}
  18.  
  19. .ChButton { position:absolute; margin:0; padding:0; border:none; top:0 }
  20.  
  21. .IntroSpecs { font-size:9pt; font-weight:700; color:windowtext }
  22.  
  23. LI {padding-bottom:6px}
  24.  
  25. </style>
  26. </head>
  27.  
  28. <body class="bodyc" scroll=no style="margin:3px; overflow: none" language="JavaScript" UserRights="!BreakoutBot:UserRights!" RPMServerAddress="!BreakoutBot:ServerAddress!" RPMCollectorPort="!BreakoutBot:CollectorPort!" BOBDone="!BreakoutBot:Done!" onclick="checkClick()" onkeydown="processBSP()"
  29. onload="    top.banner.savePageCoord(event,document.body,'AnalyzeCharts'); processChartInit()" onbeforeunload="processUnload()">
  30.  
  31. <script LANGUAGE="JavaScript">
  32. <!--
  33. //border:solid 3px graytext;  border-bottom-color:activeborder
  34. //background-image: url(/images/Background.jpg)
  35. var divNameCnt = "0";
  36. var PIP_On = true; // default PIP state
  37. var FullViewChartName = null;
  38. var CurSelectChart = null;
  39. var bdH = 60; // Button pixel height; must match value in #ButtonDiv style above
  40. var byM = null;
  41. var borderSz = 2; // Thin Bord is 2pixels
  42. var chartMargin = 3; // Chart Margin size 3pixels
  43. var SelectedBorderSz = borderSz+2;
  44. var ChartSelectedColor = "blue";
  45. var ChartNotSelectedColor = "blue";
  46. var Tid = null;
  47. var CObj = null; // Chart Manager object
  48. var BLast = null; // Last "play" type button pressed in
  49. var DeleteChID = null; // Chart ID to be deleted
  50. //Playback Delay Codes
  51. var PlaybackFast = 1;
  52. var PlaybackNormal = 5;
  53. var ChartObjectLoadError = false;
  54. var rszH = 0;
  55.  
  56. // Capture and ignore script errors
  57.     window.onerror = wwScrErr;
  58. function wwScrErr() {
  59.     return true;
  60. }
  61.  
  62. function ChartObjectError() {
  63.     alert("Required ActiveX Control RPMGRAPH.OCX did not load properly!\nUnable to continue loading MonitorIT View Charts page.");
  64.     ChartObjectLoadError = true;
  65.     if ( top.MainLoaded == true ) {
  66.          ButtonState(cNewButton,"1");    
  67.         ButtonState(cOpenButton,"1");    
  68.     }
  69. }
  70. function WaitForControlsClose(){
  71.     document.all.WarningBox.style.display = "none";
  72. }
  73. // Process Onload Complete
  74. function processChartInit() {
  75.     Tid = null; // reset if set
  76.     if ( PrimaryGraphObj.readyState != 4 ) { // Has Graph Control been loaded?
  77.         Tid = setTimeout("processChartInit()",100); // Not complete, delay 100 ms. then check again
  78.         return; // exit and wait
  79.     }
  80.     if ( ChartButtonsLoaded == false ) { // Have buttons been loaded?
  81.         if ( plChartButtons() == false ) { // No, go set them up
  82.             Tid = setTimeout("processChartInit()",500); // Not complete, delay 100 ms. then check again
  83.             return; // exit and wait
  84.         }
  85.     }
  86.     document.body.RPMServerAddress = document.body.RPMHostIP;
  87.     CObj = ChartMgr; // Chart manager object
  88.     WaitForControlsClose(); 
  89.     top.MainLoaded = true; // Flag that Main is now loaded
  90.     top.main.restore(); // insure Tree pane is visible
  91.     
  92.     // Set initial button state 
  93.     initButtonState(); // initialize buttons
  94.     if ( ChartObjectLoadError == true ) {
  95.         return;
  96.     }
  97.     // determine offsets used in height/width computations
  98.     byM = 2*parseFloat(document.body.style.margin);
  99.     processSizeChange(); // go set Window sizes
  100.     ButtonDiv.style.visibility = "visible"; // show buttons
  101.     top.banner.MerlinAssistance(); // check if in Merlin demo mode
  102.     IntroGraphStateF = 0; // Set State Falg for Intro Graph handler
  103.     Tree = top.main.TreePane.document.all.RPMTree;
  104.     Tree.SetConnected(3,0,(document.body.UserRights=="0") ? 1 : 0 ); // tell Tree Analyzt Mode
  105.     ProcPerfChecked = false; // reset Local Graph option checked
  106.     Tid = setTimeout("processIntroGraphCheck()",1000); // Delay then check if Intro Graph Mode
  107. }
  108. function processIntroGraphCheck() {
  109.     processIntroGraphMode(); // check if in Intro Graph mode
  110. }
  111.  
  112. function processUnload() {
  113.     top.BannerMenuShow();
  114.     top.banner.CurrentPageName = null;
  115.     top.main.TreePane.InventoryEventHandling = false; // Disable Tree Inventory Event handler
  116.     top.banner.processStopCommX();
  117.     if ( ProcPerfChecked == true ) {  // Set by local graph option?
  118.         //Tree.SetChecked(1,IcntItem,false); // yes- uncheck it for no monitoring
  119.         Tree.SetItemState(1,IcntItem,0,2); // Unselect counter
  120.         Tree.SetItemState(1,IoItem,0,2); // Unselect object
  121.         Tree.SetItemState(1,IcItem,0,2); // Unselect computer
  122.     }
  123.     if ( Tid != null ) {
  124.         clearTimeout(Tid); // stop timeout routine
  125.     }
  126.     if ( top.banner.Merlin != null ) {
  127.         if ( top.banner.Merlin.Visible ) { // if Merlin visible, stop and hide
  128.             top.banner.Merlin.StopAll("Move,Play,Speak");
  129.             top.banner.Merlin.Hide(true);
  130.             if ( top.banner.Tid != null ) {
  131.                 clearTimeout(top.banner.Tid); // stop timeout routine
  132.             }
  133.         }
  134.     }
  135. }
  136.  
  137. // Process a Size Change event for the Browser display area
  138. function processSizeChange() {
  139.     // Display Height and Width
  140.     bCh = document.body.clientHeight;
  141.     bCw = document.body.clientWidth;
  142.     if ( top.main.IsTreeVisible() ) {
  143.         top.main.VCcw = bCw;
  144.     }
  145.     
  146.     // Miniumu size
  147.     bCw = ( bCw < (654+byM-rszH) ) ? (654+byM-rszH) : bCw;
  148.     bCh = ( bCh < 120 ) ? 120 : bCh;
  149.    if (bCw <= (654+byM-rszH) || bCh <= 120) {
  150.        if ( document.body.scroll != "yes" ) {
  151.            bCh -= 15;
  152.        }
  153.        document.body.scroll = "yes";
  154.    }
  155.    else {
  156.        document.body.scroll = "no";
  157.    }
  158.   
  159.    // Set Height/Widths for Chart and Button areas
  160.     MainDiv.style.height = bCh-(bdH+byM-borderSz)+rszH;
  161.     MainDiv.style.width = bCw-byM;
  162.     ButtonDiv.style.top = bCh-(bdH+byM-borderSz)+rszH;
  163.     ButtonDiv.style.width = bCw-byM-2;
  164.  
  165.     //PopUpContext Menu
  166.    PopUpContextSize(bCw);
  167.     
  168.     // Compute and set position for Button groups
  169.     var i = ButtonDiv.style.posWidth; // width for button area
  170.     if ( i < 654 ) {
  171.         i = 32;   
  172.     }
  173.     else {
  174.        i -= 622;
  175.        i = Math.round( i/2 );
  176.        i = (i < 32) ? 32 : i;
  177.     }
  178.     ChCtrlButtons.style.left = i;
  179.     ChVCRButtons.style.left = i + 252;
  180.     ChScrollButtons.style.left = i + 486;
  181.     setChartPos(); // Adjust Chart positions
  182. }
  183.  
  184. // Process NEW Chart Button
  185. function processNewChart() {
  186.     // Add Chart Div to Chart Manager List
  187.     NewChart = "ChartDiv"+divNameCnt;
  188.     addElementToSelect(CObj,NewChart);
  189.     ++divNameCnt;
  190.  
  191.     // Create HTML for adding Chart Div
  192.     Ops = "<div id='" + NewChart + "' style='cursor:hand; margin:" + chartMargin;
  193.     Ops += "px' class='ChartStyle' OpType='' BlV='' HData='' HCon='' HChart='' RDel='' DWait=''>";
  194.     Ops += '<object ID="RpmGrph' + NewChart + '" ';
  195.     Ops += 'CLASSID="clsid:D8C8B275-CB6A-11D2-9BAD-204C4F4F5020" ';
  196.     Ops += 'CODEBASE="controls/RpmGraph.cab#version=5,0,0,9"></object>';
  197.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="LogMsg(Src,Msg,Type)">';
  198.      Ops += 'processEventLogMsg(Src,Msg,Type);</script>';
  199.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="ChartList(ChartList)">';
  200.      Ops += 'processChartList(this,ChartList);</script>';
  201.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="HelpContext(TopicID,SubTID)">';
  202.      Ops += 'processHelp(TopicID,SubTID);</script>';
  203.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="HasData(DaStat)">';
  204.      Ops += 'processHasData(this,DaStat);</script>';
  205.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="HasChart(ChStat)">';
  206.      Ops += 'processHasChart(this,ChStat);</script>';
  207.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="HasConnection(CnStat)">';
  208.      Ops += 'processHasConnection(this,CnStat);</script>';
  209.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="Open()">';
  210.      Ops += 'processOpenDeleteEvent(this,"Open");</script>';
  211.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="Delete()">';
  212.      Ops += 'processOpenDeleteEvent(this,"Del");</script>';
  213.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="Click()">';
  214.      Ops += 'processOnSelectChart(this);</script>';
  215.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="Dblclick()">';
  216.      Ops += 'processOnSwapChart(this);</script>';
  217.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="Export(estat,exportfile)">';
  218.      Ops += 'processExportComplete(estat,exportfile);</script>';
  219.     Ops += '<script FOR="RpmGrph' + NewChart + '" EVENT="ExportStarted()">';
  220.      Ops += 'processExportStarted();</script>';
  221.     Ops += '</div>';
  222.     
  223.     // Ouput HTML for new Chart Div
  224.     MainDiv.insertAdjacentHTML("beforeEnd",Ops);
  225.     
  226.     // Unselect Previous Selected Chart if one
  227.     if ( CurSelectChart != null ) {
  228.          document.all[CurSelectChart].style.borderColor = ChartNotSelectedColor;
  229.           document.all[CurSelectChart].style.borderWidth = borderSz+"px";
  230.     }
  231.     if ( CObj.length > 1 ) {
  232.         var cN = ( CurSelectChart == null ) ? FullViewChartName : CurSelectChart;
  233.         document.all[cN].BlV = BLast; // save chart's active "Play" button if any 
  234.         SetButtonOut(BLast); // set button out
  235.         if ( PIP_On == true ) {
  236.            SetButtonIn("Pip");
  237.        }
  238.     }
  239.     
  240.     // Set Default Values
  241.     var GFobj = document.all[NewChart]; // Graph Frame object
  242.     GFobj.BlV = "Play"; // default to "Play" button
  243.     GFobj.HData = false; // default to no coumter data on the chart
  244.     GFobj.HChart = false; // default to no chart
  245.     GFobj.HCon = false; // default to no connection
  246.     GFobj.RDel = false; // not ready to be deleted
  247.     
  248.     // Go compute sizes and positions
  249.     FullViewChartName = NewChart;
  250.     CurSelectChart = null;
  251.     setChartPos(); // Set/Adjust Chart positions
  252.     BLast = "Stop"; // default to "Stop" button
  253.     setVCRButtons(false);
  254. }
  255.  
  256. // Compute and Redisplay the Chart(s)
  257. function setChartPos() {
  258.     if ( FullViewChartName == null ) 
  259.         return; // Exit if no Charts
  260.  
  261.      GraphO = document.all["RpmGrph"+FullViewChartName]; // Selected Graph Object
  262.     FrameO = document.all[FullViewChartName]; // Selected Frame Object
  263.     
  264.     DivTitle.style.display = "none"; // Hide Title
  265.     HelpText.style.display="none";
  266.  
  267.       WH = MainDiv.style.posHeight; // Chart display Height
  268.     WW = MainDiv.style.posWidth; // Chart display Width
  269.     
  270.     // Compute 20% of  Chart display Width if PIP On
  271.    WWi = Math.round( WW/5 );
  272.    
  273.     // Compute position adjustment based on Margins and Borders
  274.     SzAdj = (2*borderSz) + byM + (2*chartMargin);
  275.  
  276.     // Position the Full View Chart at Top and Size to 80% Width if more than 1 chart
  277.     FrameO.style.height = WH-SzAdj;
  278.     
  279.     // If Only One Chart displayed    
  280.     if ( CObj.length == 1 || !PIP_On) {     
  281.         FrameO.style.width = WW-SzAdj;
  282.     }
  283.     else { // More Than One Chart; Compute FullView width of 80%
  284.         FrameO.style.width = (WW-WWi)-SzAdj;
  285.     }
  286.     // Set Top/Left and Enable Display
  287.     FrameO.style.top = "1";
  288.     FrameO.style.left = "1";
  289.     FrameO.style.display = "";
  290.  
  291.     // Size the Control 
  292.    GraphO.width = FrameO.style.width;
  293.    GraphO.height = FrameO.style.height;
  294.    GraphO.NotifyFrameMode(false);  // tell Chart it is Full View
  295.     // Process Size Adjustment For NonFullView Charts
  296.     if ( (lth = CObj.length-1) == 0 )
  297.         return; // Exit if none
  298.    
  299.     WHinc    = Math.round( WH/lth ); // Compute height increment 
  300.     WWcur = WW-WWi-(2*chartMargin); // Width position reflecting 20% plus adjustment for Chart margins
  301.     WHcur = 1; // Initialize for 1st
  302.     WWa = WWi-(SzAdj-byM); // compute adjusted Width
  303.     WHinc = (WHinc > (2*WWi)) ? WWi + Math.round( (3*WWi)/4 ): WHinc; // adjust for basic rectangles for PIPs
  304.  
  305.     // Position and size each Thumbnail Chart        
  306.     for ( var i=0; i < CObj.length; i++ ) { // Check each Chart in the Chart Manager
  307.         if ( CObj.options[i].text == FullViewChartName ) 
  308.             continue; // Skip the Full View Chart
  309.         cCN = CObj.options[i].text; // current Chart Name
  310.          GraphO = document.all["RpmGrph"+cCN]; // current Graph Object
  311.         FrameO = document.all[cCN]; // current Frame Object
  312.        if ( PIP_On ) { // if PIP On , process the Thumbnails
  313.             FrameO.style.left = WWcur;
  314.             FrameO.style.top = WHcur;
  315.             FrameO.style.width = WWa;
  316.             FrameO.style.height = WHinc-SzAdj;
  317.             FrameO.style.display = "";
  318.             WHcur += WHinc-(2*chartMargin);
  319.             if ( i%3 == 0) // Small adjustment in width every 5th chart
  320.                 --WWcur 
  321.             // Size the Control in each one
  322.               GraphO.width = FrameO.style.width;
  323.               GraphO.height = FrameO.style.height;
  324.            GraphO.NotifyFrameMode(true);  // tell Chart it is PIP View
  325.        }
  326.        else { // if PIP off, disable display
  327.              FrameO.style.display = "none";
  328.          }
  329.     }
  330.     // Set the FullView Chart the Selected/Active Chart
  331.     if ( CurSelectChart == null ) {
  332.         document.all[FullViewChartName].style.borderColor = ChartSelectedColor;
  333.        document.all[FullViewChartName].style.borderWidth = SelectedBorderSz + "px";
  334.         CurSelectChart = FullViewChartName;
  335.     }
  336. }
  337.  
  338. // Process the Chart Scroll, Forward or Backward
  339. function processScrollChart(Sdir) {
  340.     if ( FullViewChartName == null || cPipButton.bdis == "1" ) 
  341.         return; // exit if none or disabled
  342.  
  343.     // Find the Current Selected and the Full View Charts
  344.     CSCix = FVCix = null;
  345.     for ( var i=0; i < CObj.length; i++ ) {
  346.         if ( CObj.options[i].text == CurSelectChart ) 
  347.                 CSCix = i; 
  348.         if ( CObj.options[i].text == FullViewChartName ) 
  349.                 FVCix = i; 
  350.     }
  351.     // If a Chart is Currently Selected, Reset it
  352.     if ( CSCix != null ) { 
  353.         document.all[CurSelectChart].BlV = BLast; // save chart's active "Play" button if any 
  354.         SetButtonOut(BLast); // set button out
  355.           document.all[CurSelectChart].style.borderColor = ChartNotSelectedColor;
  356.        document.all[CurSelectChart].style.borderWidth = borderSz+"px";
  357.          if ( CSCix == FVCix && PIP_On) { // If chart was FUll View Chart and PIP on
  358.            CSCix = (Sdir) ? 0 : CObj.length-1; // Reset to 1st or Last based on direction
  359.         }
  360.         else {
  361.            CSCix = (Sdir) ? ++CSCix : --CSCix; // Go to next based on direction
  362.           }
  363.     }
  364.     else { // No Chart Selected, Default to 1st
  365.         CSCix = 0;   
  366.     }
  367.     // If Next Chart is Full View, Skip till end
  368.     if ( CSCix == FVCix ) { 
  369.            CSCix = (Sdir) ? ++CSCix : --CSCix; // Go to next based on direction
  370.     }
  371.     // If At End and PIP On,  Select Full View Chart
  372.     if ( ((Sdir && CSCix >= CObj.length) || (!Sdir && CSCix < 0)) && PIP_On ) { 
  373.        document.all[FullViewChartName].style.borderColor = ChartSelectedColor;
  374.        document.all[FullViewChartName].style.borderWidth = SelectedBorderSz + "px";
  375.         CurSelectChart = FullViewChartName;
  376.      }
  377.     else { // Otherwise Select Next Thumbnail
  378.         // adjust if past beginning or end
  379.         CSCix = (CSCix < 0) ? CObj.length-1 : CSCix; 
  380.         CSCix = (CSCix >= CObj.length) ? 0 : CSCix;
  381.         
  382.         // if PIP is Off make this selected one the Full View
  383.         if ( !PIP_On ) { 
  384.            FullViewChartName = CObj.options[CSCix].text;
  385.               setChartPos();
  386.           }
  387.           else { // otherwise Select it
  388.             document.all[CObj.options[CSCix].text].style.borderColor = ChartSelectedColor;
  389.              document.all[CObj.options[CSCix].text].style.borderWidth = SelectedBorderSz + "px";
  390.             CurSelectChart = CObj.options[CSCix].text;   
  391.         }
  392.     }
  393.     var FrameO = document.all[CurSelectChart]; // new selected chart
  394.     var GraphO = document.all["RpmGrph"+CurSelectChart]; // new selected chart
  395.     setVCRButtons(FrameO.HData); // set VCR Buttons accordingly
  396.     if ( FrameO.HData ) {
  397.           BLast = FrameO.BlV; // restore state of "Play" button if any
  398.         SetButtonIn(BLast); 
  399.       }
  400.     top.Rstatus.Pstat("'"+GraphO.GetGraphName()+"' selected"); 
  401. }
  402.  
  403. // Make Current Selected Chart the new Full View One
  404. function processSelectChart() {
  405.     if (CurSelectChart == null || FullViewChartName == CurSelectChart || cPipButton.bdis == "1" ) 
  406.         return; // exit if disabled, None selected or Full View already selected
  407.     FullViewChartName = CurSelectChart; 
  408.     ButtonState(cSwapButton,"1"); // Swap button off
  409.     setChartPos();
  410. }
  411.  
  412. // Process Toggle of PIP On or Off
  413. function processPIPToggle(Bobj) {
  414.     if ( Bobj.bdis == "1" ) 
  415.         return; // exit if disabled
  416.     PIP_On = (PIP_On) ? false : true; // toggle it
  417.     if ( PIP_On ) {
  418.         SetButtonIn("Pip");   
  419.     }
  420.     else {
  421.        SetButtonOut("Pip");
  422.         ButtonState(cSwapButton,"1"); // Swap button off   
  423.     }
  424.     document.all[CurSelectChart].style.borderColor = ChartNotSelectedColor;
  425.       document.all[CurSelectChart].style.borderWidth = borderSz+"px";
  426.     CurSelectChart = null;
  427.     setChartPos(); // go set Charts
  428. }
  429.  
  430. // Process Chart Button Click
  431. function processChartButton(Type) {
  432.     var Bobj = event.srcElement; // Button Object
  433.     if ( Bobj.bdis == "1" ) 
  434.         return; // exit if disabled
  435.     top.Rstatus.Pstat(""); // Clear status line
  436.     doButtonProcessing(Type);
  437. }
  438.  
  439. function doButtonProcessing(Type) {
  440.     var GraphO = null; // Selected Graph Control Object
  441.     var FrameO = null; // Selected Frame Object 
  442.     var selNme = null; // Selected Chart name
  443.     
  444.     // Determine selected chart name and entry position in the Chart Manager
  445.     selNme = getSelectedChart(); // get selected Chart name
  446.     selCmIx = getSelectedChartMgrIndex(selNme); // index in the Chart Manager
  447.     
  448.       // Get the Frame and Graph Control Objects
  449.      if ( CObj.length > 0 ) { // if at least one frame
  450.          GraphO = document.all["RpmGrph"+selNme]; // Selected Graph Object
  451.         FrameO = document.all[selNme]; // Selected Frame Object
  452.     }
  453.     
  454.     switch ( Type ) { // Process based on Button clicked
  455.     
  456.     // NEW and OPEN Button
  457.    case "New" : 
  458.    case "Open":
  459.         ButtonState(cNewButton,"1"); // disable button until OpComplete
  460.         ButtonState(cOpenButton,"1"); // disable button until OpComplete
  461.         ButtonState(cCloseButton,"1");    
  462.         ButtonState(cDelButton,"1");
  463.         ButtonState(cConfigButton,"1");
  464.         ButtonState(cAddButton,"1");
  465.         ButtonState(cSaveButton,"1");
  466.         ButtonState(cExpButton,"1");
  467.           processNewChart(); // Open up a NEW Chart
  468.         document.all[FullViewChartName].OpType = Type; // Save operation type
  469.           DoNewOpen(); // go do New Open processing and insure Graph Control is loaded
  470.          break;
  471.  
  472.    // CLOSE Button    
  473.    case "Close":
  474.          top.banner.processStopCommX();
  475.           SetCursor("auto");
  476.           top.Rstatus.Pstat("Closing Chart '"+GraphO.GetGraphName()+"'"); 
  477.          GraphO.Close(true); // Close the Chart control
  478.         IntroGraphStateF = 0; // reset IntroGraph Mode if active
  479.         top.banner.IntroGraphMode = false;
  480.         //FrameO.RDel = true;  // flag to delete frame
  481.         //Tid = setTimeout("processSchedDelete()",1000); // Delete from off of T/O func
  482.        break;
  483.  
  484.    // SAVE Button    
  485.    case "Save":
  486.         GraphO.Enable(false); // disable Chart window so Dialogue can get focus
  487.         var SMfeatures = "border:thin; center:yes; dialogHeight:205px; dialogWidth:400px; help:no; maximize:no; minimize:no";
  488.         var selChartAr = new Array();
  489.         var dArgsArr = new Array();
  490.         dArgsArr[0] = "Name";
  491.         dArgsArr[1] = GraphO.GetGraphName();        
  492.         selChartAr = window.showModalDialog("ChartSelect.htm",dArgsArr,SMfeatures);
  493.         GraphO.Enable(true); // restore Chart window
  494.         window.focus(); // make sure Window has focus
  495.         if ( selChartAr[0] == true ) {
  496.            GraphO.SetGraphName(selChartAr[1])
  497.         }
  498.        top.Rstatus.Pstat("Saving Chart '"+GraphO.GetGraphName()+"'"); 
  499.          GraphO.Save(); // Save the Chart 
  500.        top.Rstatus.Pstat("Chart '"+GraphO.GetGraphName()+"' Saved"); 
  501.        break;
  502.    
  503.    // EXPORT Button    
  504.    case "Exp":
  505.          if ( GraphO.IsDataPresent() ) {
  506.             ButtonState(cExpButton,"1");
  507.               SetCursor("wait");
  508.               top.banner.processStartComm();
  509.             top.Rstatus.Pstat("One moment while exporting data for Chart '"+GraphO.GetGraphName()+"'"); 
  510.              GraphO.Export(); // Export
  511.          }
  512.        break;
  513.  
  514.    // DELETE Button    
  515.    case "Del":
  516.        if ( !GraphO.GetChartList() ) { // Request list of available charts
  517.             top.Rstatus.Pstat("Request to get List of Charts unsuccessful",true); 
  518.         }
  519.         else {
  520.            FrameO.OpType = Type; // Save operation type
  521.        } // exit and wait OpComplete
  522.        break;
  523.    
  524.    // CONFIG Button    
  525.    case "Config":
  526.          GraphO.Wizard(); // Call method 
  527.          if ( GraphO.IsDataPresent() ) {
  528.              GraphO.Save(); // Insure saved
  529.          }
  530.        break;
  531.       
  532.       // ADD Button
  533.    case "Add":
  534.        if ( GraphO != null ) {
  535.             sArray = top.main.TreePane.RPMTree.GetSelectedIDs();
  536.              GraphO.AddCounters(sArray); // Call method 
  537.              GraphO.Save(); // Insure saved
  538.             if ( !FrameO.HData ) { // if no data on chart yet
  539.                   SetCursor("wait");
  540.                 top.banner.processStartComm();
  541.                 FrameO.WData = 1;
  542.             }
  543.         }
  544.        break;
  545.    
  546.    // Fast Reverse Button
  547.    case "FR":
  548.        GraphO.PlaybackDelay = PlaybackFast; // set for fast speed
  549.           if ( GraphO.Reverse() ) { // Call method
  550.               SetButtonOut(BLast);
  551.             SetButtonIn("FR");
  552.              FrameO.BlV = BLast = "FR"
  553.          }
  554.           break;
  555.       
  556.    // Normal Reverse Button
  557.     case "Rev":
  558.        GraphO.PlaybackDelay = PlaybackNormal; // set for normal speed
  559.           if ( GraphO.Reverse() ) { // Call method
  560.              SetButtonOut(BLast);
  561.               SetButtonIn("Rev");
  562.              FrameO.BlV = BLast = "Rev"
  563.          }
  564.          break;
  565.           
  566.    // Stop Button
  567.   case "Stop":
  568.          if ( GraphO.Stop() ) { // Call method
  569.              SetButtonOut(BLast);
  570.               SetButtonIn("Stop");
  571.              FrameO.BlV = BLast = "Stop"
  572.          }
  573.         break;
  574.           
  575.    // Normal Play Button
  576.    case "Play":
  577.        GraphO.PlaybackDelay = PlaybackNormal; // set for normal speed
  578.         if ( GraphO.Play() ) { // Call method
  579.              SetButtonOut(BLast);
  580.              SetButtonIn("Play");
  581.              FrameO.BlV = BLast = "Play"
  582.          }
  583.           break;
  584.       
  585.    // Fast Forward Button
  586.    case "FF":
  587.         GraphO.PlaybackDelay = PlaybackFast; // set for fast speed
  588.           if ( GraphO.Play() ) { // Call method
  589.              SetButtonOut(BLast);
  590.             SetButtonIn("FF");
  591.              FrameO.BlV = BLast = "FF"
  592.          }
  593.        break;
  594.        
  595.    // Fine Tune Properties Button
  596.    case "FineTune":
  597.        GraphO.ShowProperties();
  598.        break;
  599.      
  600.    // Toggle Tree View Button
  601.    case "Tree":
  602.        if ( top.main.IsTreeVisible() ) {
  603.             top.main.expand(); // hide Tree
  604.               ChCtrlButtons.style.display="none";
  605.               ChVCRButtons.style.display="none";
  606.               ChScrollButtons.style.display="none";
  607.               ChTreeButtons.style.display="none";
  608.            ChTreeButtonsH.style.display="";
  609.               rszH = 38;
  610.         }
  611.         else {
  612.              top.main.restore(); // show Tree
  613.               ChCtrlButtons.style.display="";
  614.               ChVCRButtons.style.display="";
  615.               ChScrollButtons.style.display="";
  616.               ChTreeButtons.style.display="";
  617.            ChTreeButtonsH.style.display="none";
  618.              rszH = 0;
  619.         }
  620.         processSizeChange();
  621.        break;
  622.      }
  623. }
  624.  
  625. // New/Open Function;  Insure Graph Control is Loaded
  626. function DoNewOpen() {
  627.     Tid = null; // reset if set
  628.     
  629.    var selNme = FullViewChartName; // new chart 
  630.       var GraphO = document.all["RpmGrph"+selNme]; // New selected Graph Object
  631.     var FrameO = document.all[selNme]; // Selected Frame Object
  632.  
  633.     // Insure the Graph Control is loaded
  634.     if ( GraphO.readyState != 4 ) { // Has Graph Control been loaded?
  635.         Tid = setTimeout("DoNewOpen()",100); // Not complete, delay 100 ms. then check again
  636.         return; // exit and wait
  637.     }
  638.     // Connect Chart to the Server 
  639.     var Bobj = document.body; // get BODY object    
  640.     var Cp = parseInt(Bobj.RPMCollectorPort,10);
  641.     var Ar = "~AnalystRights="+((document.body.UserRights=="0") ? "1": "0");
  642.     if ( !( GraphO.Connect(Bobj.RPMServerAddress+Ar,Cp) ) ) {
  643.         top.Rstatus.Pstat("CONNECT Request to Server Failed",true); 
  644.         FrameO.OpType = null; // Clear
  645.     }
  646. }
  647.  
  648. // Process OPEN and DELETE Event Requests from Chart's Context Menu
  649. function processOpenDeleteEvent(GraphO,fnc) {
  650.     top.Rstatus.Pstat(""); // Clear status line
  651.     // Get Frame object based on Graph object
  652.     var cFn = GraphO.id.substring(7,GraphO.id.length);
  653.     var FrameO = document.all[cFn]; // Frame object
  654.  
  655.     if ( fnc == "Open" ) { // if Open event
  656.        if ( !GraphO.GetChartList() ) { // Request list of available charts
  657.             top.Rstatus.Pstat("Request to get List of Charts unsuccessful",true); 
  658.         }
  659.         else {
  660.            FrameO.OpType = "Open"; // Set operation type
  661.        } // exit and wait OpComplete
  662.    }
  663.    else { // other wise Delete event
  664.         if ( confirm("Are you sure you want to Delete the Chart: "+GraphO.GetGraphName()+" ?") ) {
  665.             // Delete user specified chart
  666.             if ( !GraphO.Delete(GraphO.ChartID) ) {  
  667.                top.Rstatus.Pstat("Chart DELETE Request to Server Failed",true); 
  668.             }
  669.             else {
  670.                top.Rstatus.Pstat("Deleting Chart named '"+GraphO.GetGraphName()+"'"); 
  671.                 initButtonState(); // reset Buttons
  672.                  ButtonState(cNewButton,"1"); // disable NEW button until OpComplete
  673.                 ButtonState(cOpenButton,"1"); // disable Open button until OpComplete
  674.              } // Exit until OpComplete
  675.         } // Confirm true
  676.     }
  677. }
  678.  
  679. // Process HasConnect Event
  680. function processHasConnection(GraphO,CnStat) {
  681.     top.Rstatus.Pstat(""); // Clear status line
  682.     // Get Frame object based on Graph object
  683.     var cFn = GraphO.id.substring(7,GraphO.id.length);
  684.     var FrameO = document.all[cFn]; // Frame object
  685.     var selCmIx = getSelectedChartMgrIndex(cFn); // Chart Mgr index for this Frame
  686.  
  687.     // if Connect State is now True
  688.      if ( CnStat == true ) {
  689.         ButtonState(cCloseButton,"0");    
  690.          FrameO.HCon = true;
  691.        if ( FrameO.OpType == "New" ) { // if NEW Pending
  692.            rstat = GraphO.New(); // issue NEW call
  693.           }
  694.        else if ( FrameO.OpType == "Open" ){ // if OPEN Pending
  695.            rstat = GraphO.GetChartList(); // Request list of available charts
  696.           }
  697.           else {
  698.               return; // unexpected, ignore
  699.           }
  700.        if ( rstat == false ) { // if unsuccessful initiating
  701.            top.Rstatus.Pstat("Chart NEW/OPEN Request Failed",true); 
  702.            FrameO.RDel = true;  // flag to delete frame
  703.             Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  704.           }
  705.    } // if NEW/GetChartList initiated OK, exit until OpComplete
  706.    
  707.    else { // Disconnect, delete Frame and Graph
  708.        top.Rstatus.Pstat("Disconnected"); 
  709.        FrameO.RDel = true;  // flag to delete frame
  710.         Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  711.         alert("Disconnected from MonitorIT Server!");
  712.    }
  713. }
  714.  
  715. // Process HasChart Event
  716. function processHasChart(GraphO,ChStat) {
  717.     // Get Frame object based on Graph object
  718.     var cFn = GraphO.id.substring(7,GraphO.id.length);
  719.     var FrameO = document.all[cFn]; // Frame object
  720.     var selCmIx = getSelectedChartMgrIndex(cFn); // Chart Mgr index for this Frame
  721.    if ( selCmIx >= CObj.length ) {
  722.        return; // exit if not valid
  723.    }
  724.     // if Chart State is now False
  725.     if ( ChStat == false ) { // no more Chart
  726.         top.Rstatus.Pstat(""); // Clear status line
  727.         top.banner.processStopCommX();
  728.           SetCursor("auto");
  729.        FrameO.RDel = true;  // flag to delete frame
  730.         Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  731.    }
  732.    else { // otherwise, Chart is now Active
  733.        FrameO.HChart = true;
  734.         var selNme = getSelectedChart();
  735.         if ( selNme == null ) {
  736.             return; // exit if no chart selected
  737.         }
  738.         FrameO.WData = (FrameO.OpType == "New") ? 20 : 1; // initialize
  739.         // if this Chart is Current Select Chart, set Buttons
  740.         if ( FrameO == document.all[selNme] ) {
  741.             setVCRButtons(FrameO.HData);
  742.             if ( FrameO.OpType == "New" ) {
  743.                 setButtonsOn();
  744.             }
  745.             else if ( FrameO.HData ) {
  746.                 setButtonsOn();
  747.                   BLast = FrameO.BlV; // restore state of "Play" button if any
  748.                   SetButtonIn(BLast); 
  749.                   if ( BLast == "Play" ) {
  750.                       GraphO.Play();
  751.                   }
  752.               }
  753.         }
  754.     }
  755. }
  756.  
  757. // HasData Event; Enable/Disable VCR Controls if Chart is Selected
  758. function processHasData(GraphO,DaStat) {
  759.     var cFn = GraphO.id.substring(7,GraphO.id.length);
  760.     var FrameO = document.all[cFn]; // Frame object
  761.     
  762.     // If Has Data and previously Had Data, ignore
  763.     if ( DaStat == FrameO.HData && DaStat ) 
  764.         return;
  765.         
  766.     // Save the HasData state for this Chart
  767.     FrameO.HData = DaStat; 
  768.     var selNme = getSelectedChart();
  769.     
  770.     if ( DaStat == true ) { // if Has Data
  771.         FrameO.WData = 0; // reset
  772.         top.banner.processStopCommX();
  773.           SetCursor("auto");
  774.         top.Rstatus.Pstat(""); // Clear status line
  775.     }
  776.     else {
  777.         if ( FrameO.WData > 0 ) {
  778.              if ( FrameO.WData%30 == 0  ) {
  779.                alert("No data found yet in the database for the Counter(s) specified on chart '"+GraphO.GetGraphName()+"'!\n\nMake sure a Counter is being monitored by setting its associated checkbox in the 'Monitor Objects Tree' at left;\nOn Opening an existing Chart, make sure there is monitored data for the time-frame specified!\n\nIf you have just checked a Counter to start monitoring, it will take up to 2x the sampling\ninterval (default is 30 secs, therefore delay is 60 seconds) before data starts graphing!"); 
  780.             }
  781.              ++FrameO.WData;
  782.             if ( FrameO.WData > 30 ) {
  783.                 var nmsg = "Insure the Counter checkbox is checked to start monitoring";
  784.                 for ( var i=0; i<FrameO.WData%10; i++ ) {
  785.                    nmsg += ">";
  786.                 }
  787.                 top.Rstatus.Pstat(nmsg);
  788.             }
  789.         }
  790.          FrameO.OpType = null;
  791.         return;
  792.     }
  793.     // if this Chart is Current Select Chart, set VCR Buttons
  794.     if ( selNme == null ) {
  795.         return; // exit if no chart selected
  796.     }
  797.     if ( FrameO == document.all[selNme] ) {
  798.         setVCRButtons(DaStat);
  799.         if ( FrameO.HData ) {
  800.             FrameO.WData = 0; // reset
  801.             setButtonsOn();
  802.               BLast = FrameO.BlV; // restore state of "Play" button if any
  803.               SetButtonIn(BLast); 
  804.               if ( BLast == "Play" ) {
  805.                   GraphO.Play();
  806.               }
  807.           }
  808.     }
  809. }
  810.  
  811. // Process Event Chart List 
  812. function processChartList(GraphO,ChartList) {
  813.     // Get Frame object based on Graph object
  814.     var cFn = GraphO.id.substring(7,GraphO.id.length)
  815.     var FrameO = document.all[cFn]; // Frame object
  816.     if ( FrameO.OpType != "Open" && FrameO.OpType != "Del") {
  817.         return; // unexpected, ignore
  818.     }
  819.     var selChartAr = new Array();
  820.     selChartAr = ChartList.split(","); // check if only one chart
  821.     
  822.     if ( selChartAr[0] == 0 ) { // if no Charts
  823.         if ( top.banner.DemoMode && FrameO.OpType == "Open" ) {
  824.               top.Rstatus.Pstat("Chart OPEN Request Failed",true); 
  825.            FrameO.RDel = true;  // flag to delete frame
  826.             Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  827.             processViewChartsBookmarks(ChartNotFoundBid)        
  828.             return; // exit
  829.         }
  830.           if ( GraphO.New() == false ) { // issue NEW call instead
  831.            top.Rstatus.Pstat("Chart OPEN Request Failed",true); 
  832.            FrameO.RDel = true;  // flag to delete frame
  833.             Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  834.         }
  835.         else {
  836.               top.Rstatus.Pstat("Chart OPEN Request Failed; no Charts found",true); 
  837.             ButtonState(cCloseButton,"0"); // enable close & config button
  838.             ButtonState(cConfigButton,"0");
  839.         }
  840.         return; // exit
  841.     }
  842.  
  843.     // Check if Demo Mode else Go prompt for name of chart to Open or Delete
  844.     if ( top.banner.DemoMode && FrameO.OpType == "Open" ) {
  845.          for ( var i=2; i< selChartAr.length; i+=2 ) { 
  846.             if ( selChartAr[i] == ChartOpenName ) {
  847.                 break; // stop looking
  848.             }
  849.         }
  850.         if ( i >= selChartAr.length ) { // if not found
  851.            top.Rstatus.Pstat("Chart OPEN Request Failed",true); 
  852.            FrameO.RDel = true;  // flag to delete frame
  853.             Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  854.             processViewChartsBookmarks(ChartNotFoundBid)        
  855.             return; // exit
  856.         }
  857.         selChartAr[0] = true; // flag OK
  858.         selChartAr[1] = selChartAr[i-1]; // Chart ID
  859.         selChartAr[2] = selChartAr[i]; // Chart Name
  860.         processViewChartsBookmarks(OpenBkMrk)        
  861.     }
  862.     else if ( !(selChartAr[0] == 1 && FrameO.OpType == "Del") ) { // skip Dialogue if Delete and only one Chart
  863.         GraphO.Enable(false); // disable Chart window so Dialogue can get focus
  864.         var SMfeatures = "border:thin; center:yes; dialogHeight:205px; dialogWidth:400px; help:no; maximize:no; minimize:no";
  865.         //"ChartSelect.htm",FrameO.OpType+";"+ChartList;
  866.         var dArgsArr = new Array();
  867.         dArgsArr[0] = FrameO.OpType;
  868.         dArgsArr[1] = ChartList;
  869.         
  870.         selChartAr = window.showModalDialog("ChartSelect.htm",dArgsArr,SMfeatures);
  871.         GraphO.Enable(true); // restore Chart window
  872.         window.focus(); // make sure Window has focus
  873.     }
  874.     ChID = selChartAr[1]; // selected Chart ID
  875.     
  876.     if ( FrameO.OpType == "Del" ) { // If Delete operation type
  877.  
  878.         if ( selChartAr[0] == true ) { // if user Selected
  879.            if ( confirm("Are you sure you want to Delete the following Chart(s)? "+selChartAr[2]) ) {
  880.                  // Check if Chart is being displayed
  881.                  var dCar = new Array();
  882.                  dCar = ChID.split(","); // get list of IDs to delete
  883.                 for ( var di=0; di < CObj.length; di++ ) { // for each Chart in Chrat Mgr
  884.                     for ( var aix=0; aix < dCar.length; aix++ ) { // compare against list of Charts to delete
  885.                        if ( document.all["RpmGrph"+CObj.options[di].text].ChartID == dCar[aix]) { // if match
  886.                               GraphO = document.all["RpmGrph"+CObj.options[di].text]; // Chart Object to be deleted
  887.                            break;
  888.                        }
  889.                    }
  890.                    if ( aix < dCar.length ) { // break from Chart Mgr "for loop" if match was found
  891.                        break;
  892.                    }
  893.                   }
  894.                 // Delete user specified chart
  895.                 if ( !GraphO.Delete(ChID) ) {  
  896.                    top.Rstatus.Pstat("Chart DELETE Request to Server Failed",true); 
  897.                 }
  898.                 else {
  899.                    top.Rstatus.Pstat("Deleting Chart(s)"); 
  900.                    if ( di < CObj.length ) { // if deleted Chart is being displayed
  901.                         initButtonState(); // reset Buttons
  902.                           ButtonState(cNewButton,"1"); // disable NEW button until OpComplete
  903.                          ButtonState(cOpenButton,"1"); // disable Open button until OpComplete
  904.                      }
  905.                  } // Exit until OpComplete
  906.                  
  907.             } // Confirm true
  908.        } // User Selected
  909.         FrameO.OpType = null; // clear
  910.     } // end Delete
  911.     
  912.     else { // otherwise "Open" operation type
  913.     
  914.         if ( selChartAr[0] == false ) { // if user Canceled
  915.             FrameO.OpType = null; // clear
  916.             if ( FrameO.HChart == true ) { // if Had a Chart previous to Open
  917.                 var selNme = getSelectedChart(); // get selected Chart
  918.                 if ( selNme != null ) {
  919.                     // if this Chart is Current Select Chart, set Buttons
  920.                     if ( FrameO == document.all[selNme] ) {
  921.                           ButtonState(cNewButton,"0"); // reenable NEW and OPEN buttons
  922.                          ButtonState(cOpenButton,"0"); 
  923.                      }
  924.                  }
  925.              }
  926.              else { // Did not have a Chart previously
  927.                 top.Rstatus.Pstat(""); // Clear status line
  928.                FrameO.RDel = true;  // flag to delete frame
  929.                 Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  930.              }
  931.         }
  932.         // Open user specified chart
  933.         else {
  934.             if ( GraphO.open(ChID ,selChartAr[3]+"~"+selChartAr[5]) == false ) {
  935.                top.Rstatus.Pstat("Chart OPEN Request Failed",true); 
  936.                FrameO.RDel = true;  // flag to delete frame
  937.                 Tid = setTimeout("processSchedDelete()",500); // Delete from off of T/O func
  938.             }
  939.             // Exit and wait Open Op Complete
  940.             else {
  941.                   SetCursor("wait");
  942.                   top.banner.processStartComm();
  943.                   FrameO.WData = 1; // init
  944.                top.Rstatus.Pstat("Opening Chart '"+selChartAr[2]+"' From "+selChartAr[4]+" -To- "+selChartAr[6]); 
  945.                 if ( ChartMgr.length == 2 && !PIP_On ) { // if PIP Off, default to PIP On
  946.                     processPIPToggle(cPipButton); 
  947.                 }
  948.                 FrameO.OpType = ""; // clear
  949.               }
  950.           }
  951.    } // end Open
  952. }
  953.  
  954. // Process Click on a Thumbnail Chart to make it the Current Selected Chart
  955. function processOnSelectChart(GraphO) {
  956.     top.Rstatus.Pstat(""); // Clear status line
  957.     // Get Frame object based on Graph object
  958.     var cFn = GraphO.id.substring(7,GraphO.id.length);
  959.     var FrameO = document.all[cFn]; // Frame object
  960.     var selNme = getSelectedChart(); // current selected Chart
  961.     if ( selNme == cFn ) { // if no change, ignore
  962.         return;
  963.     }
  964.     // If there is a current selected chart, reset it    
  965.     if ( selNme != null ) { 
  966.         document.all[selNme].BlV = BLast; // save chart's active "Play" button if any 
  967.         SetButtonOut(BLast); // set button out
  968.           document.all[selNme].style.borderColor = ChartNotSelectedColor;
  969.        document.all[selNme].style.borderWidth = borderSz+"px";
  970.    }
  971.    if ( CObj.length > 1 ) { // if more than one chart
  972.        // Set this clicked Chart as selected
  973.         FrameO.style.borderColor = ChartSelectedColor;
  974.          FrameO.style.borderWidth = SelectedBorderSz + "px";
  975.         CurSelectChart = cFn;  
  976.         // Set buttons 
  977.         setVCRButtons(FrameO.HData); // set VCR Buttons accordingly
  978.         if ( FrameO.HData ) {
  979.               BLast = FrameO.BlV; // restore state of "Play" button if any
  980.               SetButtonIn(BLast); 
  981.           }
  982.         top.Rstatus.Pstat("'"+GraphO.GetGraphName()+"' selected"); 
  983.       }
  984. }
  985.  
  986. // Process DoubleClick on a Thumbnail Chart to make it the Current Selected Chart and Full View
  987. function processOnSwapChart(GraphO) {
  988.     top.Rstatus.Pstat(""); // Clear status line
  989.    if ( CObj.length > 1 ) { // if more than one chart
  990.         processOnSelectChart(GraphO); // go select Chart 
  991.         FullViewChartName = CurSelectChart; // now Swap it to Full View
  992.         ButtonState(cSwapButton,"1"); // Swap button off
  993.         setChartPos();
  994.     }
  995. }
  996.  
  997. // Enable/Disable Add Counter Button
  998. function processEnableAddButton(IsSelected) {
  999.     if ( top.MainLoaded == false ) {
  1000.         return; // not loaded yet
  1001.     }
  1002.     if ( CObj.length != 0 ) {
  1003.         ButtonState(cAddButton,top.main.TreePane.AddBState);
  1004.     }
  1005. }
  1006.  
  1007. // Process Event Log Message
  1008. function processEventLogMsg(Src,Msg,Type) {
  1009.     sM = ( Msg == "" ) ? Msg : " : "+Msg;
  1010.     //top.Rstatus.Pstat(Src+sM);
  1011. }
  1012.  
  1013. // Process the Help Requested Event
  1014. function processHelp(TopicID,SubTID) {
  1015.     alert("Help: TopicID=" + TopicID + "  SubTopicID=" + SubTID);
  1016. }
  1017.  
  1018. // Process a Scheduled delete of a Frame
  1019. function processSchedDelete() {
  1020.     var FO; // Frame Object
  1021.     for ( var i=0; i < CObj.length; i++ ) {
  1022.         FO = document.all[CObj.options[i].text];
  1023.        if ( FO.RDel == true  ) {
  1024.            processDeleteFrame(FO,i); // go delete frame
  1025.            break;
  1026.           }
  1027.      }
  1028.     Tid = null; // clear T/O ID
  1029. }
  1030.  
  1031. // Delete Frame Processing
  1032. function processDeleteFrame(FO,sCmIx) { 
  1033.     var sN = CObj.options[sCmIx].text; // Frame name
  1034.      var Gob = document.all["RpmGrph"+sN]; // Graph Object
  1035.      if ( CurSelectChart != null ) {
  1036.         document.all[CurSelectChart].style.borderColor = ChartNotSelectedColor;
  1037.           document.all[CurSelectChart].style.borderWidth = borderSz+"px";
  1038.       }
  1039.    FO.outerText = ""; // delete the frame 
  1040.       CObj.remove(sCmIx); // remove from Chart Manager
  1041.       CurSelectChart = null; // no current chart selected
  1042.     SetButtonOut(BLast);
  1043.       if ( CObj.length > 0 ) { // if at least one chart
  1044.           FullViewChartName = CObj.options[0].text; // default to 1st Chart
  1045.           setChartPos(); // redisplay
  1046.          setButtonsOn(); 
  1047.         setVCRButtons(document.all[FullViewChartName].HData); // set VCR Buttons accordingly
  1048.         if ( document.all[FullViewChartName].HData ) {
  1049.               BLast = document.all[FullViewChartName].BlV; // restore state of "Play" button if any
  1050.               SetButtonIn(BLast); 
  1051.           }
  1052.           if ( CObj.length == 1 ) { // if only one Chart, set unselected border
  1053.               document.all[FullViewChartName].style.borderColor = ChartNotSelectedColor;
  1054.            document.all[FullViewChartName].style.borderWidth = borderSz+"px";
  1055.             PIP_On = true; // reset PIP
  1056.            SetButtonOut("Pip");
  1057.         }
  1058.      }
  1059.       else { // otherwise no charts
  1060.           initButtonState();
  1061.         FullViewChartName = null;
  1062.         DivTitle.style.display = ""; // Display Title
  1063.         HelpText.style.display="";
  1064.         BLast = null;
  1065.       }
  1066. }
  1067.  
  1068. // Set initial button state
  1069. function initButtonState() {
  1070.     ButtonState(cNewButton,"0");    
  1071.     ButtonState(cOpenButton,"0");    
  1072.     ButtonState(cCloseButton,"1");    
  1073.     ButtonState(cDelButton,"1");
  1074.     ButtonState(cConfigButton,"1");
  1075.     ButtonState(cAddButton,"1");
  1076.     ButtonState(cRevButton,"1");
  1077.     ButtonState(cStopButton,"1");
  1078.     ButtonState(cPlayButton,"1");
  1079.     ButtonState(cFRButton,"1");
  1080.     ButtonState(cFineTuneButton,"1");
  1081.     ButtonState(cFFButton,"1");
  1082.     ButtonState(cPipButton,"1");
  1083.     ButtonState(cSwapButton,"1");
  1084.     ButtonState(cNextButton,"1");
  1085.     ButtonState(cPrevButton,"1");
  1086.     ButtonState(cSaveButton,"1");
  1087.     ButtonState(cExpButton,"1");
  1088.     cSepLong1.src = "images/SepLong.gif";
  1089.     cSepLong2.src = cSepLong1.src;
  1090. }
  1091.  
  1092. function setButtonsOn() {
  1093.     ButtonState(cNewButton,"0"); // reenable button
  1094.      ButtonState(cOpenButton,"0");
  1095.     ButtonState(cAddButton,top.main.TreePane.AddBState);
  1096.     if (CObj.length > 0) { // if first one, enable the other Chart buttons
  1097.         ButtonState(cDelButton,"0");
  1098.         ButtonState(cCloseButton,"0");    
  1099.         ButtonState(cConfigButton,"0");
  1100.         ButtonState(cSaveButton,"0");
  1101.         // only one chart, disable PIP control buttons
  1102.         ButtonState(cPipButton,"1");
  1103.         ButtonState(cSwapButton,"1");
  1104.         ButtonState(cNextButton,"1");
  1105.         ButtonState(cPrevButton,"1");
  1106.      }
  1107.     if ( CObj.length > 1) { // if 2 or more Charts opened, enable the Scroll/PIP Buttons
  1108.         ButtonState(cPipButton,"0");
  1109.         // toggle PIP state, then go toggle back to state on entry 
  1110.         //  and insure correct button is set
  1111.         PIP_On = (PIP_On) ? false : true; 
  1112.         processPIPToggle(cPipButton); 
  1113.         //ButtonState(cSwapButton,"0");
  1114.         ButtonState(cNextButton,"0");
  1115.         ButtonState(cPrevButton,"0");
  1116.     }
  1117. }
  1118.  
  1119. function setVCRButtons(onf) {
  1120.     onf = ( onf == true ) ? "0" : "1";
  1121.     ButtonState(cRevButton,onf);
  1122.     ButtonState(cStopButton,onf);
  1123.     ButtonState(cPlayButton,onf);
  1124.     ButtonState(cFRButton,onf);
  1125.     ButtonState(cFineTuneButton,onf);
  1126.     ButtonState(cFFButton,onf);
  1127.     ButtonState(cExpButton,onf);
  1128.     if ( FullViewChartName == CurSelectChart || CObj.length <= 1) {
  1129.         ButtonState(cSwapButton,"1"); // Swap button off   
  1130.     }
  1131.     else {
  1132.         ButtonState(cSwapButton,"0"); // Swap button on   
  1133.     }
  1134. }
  1135.  
  1136. // Set the Play/Stop/Rev/FF/FR Buttons In or Out
  1137. function SetButtonIn(Bnme) {
  1138.     if ( Bnme == null ) 
  1139.         return; // exit if none
  1140.     var Bobj = document.all["c"+Bnme+"Img"];
  1141.     Bobj.src = "images/"+Bnme+"RedImg.gif";
  1142.     if ( Bnme == "Stop" ) {
  1143.         var Bobj = document.all["c"+Bnme+"Img1"];
  1144.         Bobj.src = "images/"+Bnme+"RedImg.gif";
  1145.     }
  1146.     if ( Bnme == "Play" || Bnme == "Stop" || Bnme == "Pip" ) {
  1147.         var Bobj = document.all["c"+Bnme+"ImgH"];
  1148.         Bobj.src = "images/"+Bnme+"RedImg.gif";
  1149.     } 
  1150. }
  1151.  
  1152. function SetButtonOut(Bnme) {
  1153.     if ( Bnme == null ) 
  1154.         return; // exit if none
  1155.     var Bobj = document.all["c"+Bnme+"Img"];
  1156.     Bobj.src = "images/"+Bnme+"Img.gif";
  1157.     if ( Bnme == "Stop" ) {
  1158.         var Bobj = document.all["c"+Bnme+"Img1"];
  1159.         Bobj.src = "images/"+Bnme+"Img.gif";
  1160.     }
  1161.     if ( Bnme == "Play" || Bnme == "Stop" || Bnme == "Pip" ) {
  1162.         var Bobj = document.all["c"+Bnme+"ImgH"];
  1163.         Bobj.src = "images/"+Bnme+"Img.gif";
  1164.     } 
  1165. }
  1166. function ButtonState(bObj,bst) {
  1167.     if ( bObj.id == "cDelButton" || bObj.id == "cNewButton" || 
  1168.           bObj.id == "cSaveButton" || bObj.id == "cConfigButton" || 
  1169.            bObj.id == "cFineTuneButton" || bObj.id == "cAddButton" ) {
  1170.         if ( document.body.UserRights == "0" ) {
  1171.            return;
  1172.         }
  1173.     }      
  1174.            
  1175.     bObj.bdis = bst; // save state
  1176.     bObj.disabled = (bst == "0") ? "" : "disabled";
  1177.     //bObj.className = (bst == "0") ? "BoxButton" : "BoxButtonD";
  1178.     if ( bObj.id == "cOpenButton" || bObj.id == "cNewButton" || 
  1179.           bObj.id == "cPlayButton" || bObj.id == "cStopButton" || 
  1180.            bObj.id == "cPipButton" ) {
  1181.         ButtonState(document.all[bObj.id+"H"],bst);
  1182.     }
  1183. }
  1184.  
  1185. // Determine the Current Selected Chart
  1186. function getSelectedChart() {
  1187.     //top.banner.processStopCommX(); // stop Animated logo
  1188.     return( (CObj.length == 0) ? null : ((CObj.length == 1) ? FullViewChartName : CurSelectChart) );
  1189. }
  1190.  
  1191. // Determine Chart Manager Index for a Given Chart Name
  1192. function getSelectedChartMgrIndex(cNme) {    
  1193.     //top.banner.processStopCommX(); // stop Animated logo
  1194.     for ( var selCmIx=0; selCmIx < CObj.length; selCmIx++ ) {
  1195.        if ( CObj.options[selCmIx].text == cNme ) {
  1196.            break;
  1197.         }
  1198.      }
  1199.     return selCmIx; // return Chart manager Index
  1200. }
  1201.  
  1202. // Process to Toggle the Hide and Show of the Banner & Menu Frames
  1203. var hideToggle = 0;
  1204. function processBannerMenu() {
  1205.     if ( hideToggle == 0 ) {
  1206.         top.BannerMenuHide(); hideToggle = 1;   
  1207.     }
  1208.     else {
  1209.         top.BannerMenuShow(); hideToggle = 0;   
  1210.     }   
  1211. }
  1212.  
  1213. function processViewChartsBookmarks(bid) {
  1214.     switch ( bid ) {
  1215.         case 9998: // IntroGraph Processing
  1216.         case 9999:
  1217.             top.banner.DemoMode = false; // reset 
  1218.             IntroGraphStateF = bid;
  1219.             processIntroGraphMode();
  1220.             break;
  1221.     }
  1222. }
  1223.     
  1224. function PopUpContextOpen() {
  1225.     MainDiv.style.visibility = "hidden";
  1226. }
  1227. function PopUpContextClose() {
  1228.     MainDiv.style.visibility = "visible";
  1229. }
  1230.  
  1231. function processExportComplete(estat,exportfile) {
  1232.     if ( estat ) {
  1233.         alert("Chart data successfully exported to file named: '"+exportfile+"'");   
  1234.     }
  1235.     else {
  1236.         alert("Chart data export failed");   
  1237.     }
  1238.     top.Rstatus.Pstat(""); 
  1239.     top.banner.processStopCommX();
  1240.     SetCursor("auto");
  1241.     ButtonState(cExpButton,"0");
  1242. }
  1243.  
  1244. function processExportStarted() {
  1245.     ButtonState(cExpButton,"1");
  1246.     SetCursor("wait");
  1247.     top.banner.processStartComm();
  1248.     top.Rstatus.Pstat("One moment while exporting data for Chart '"+GraphO.GetGraphName()+"'"); 
  1249. }
  1250.  
  1251. //-->
  1252. </script>
  1253. <script LANGUAGE="JavaScript" src="js/IntroGraph.js"></script>
  1254. <script LANGUAGE="JavaScript" src="js/MiscFunc.js"></script>
  1255. <script LANGUAGE="JavaScript" src="js/ButtonFunc.js"></script>
  1256. <script LANGUAGE="JavaScript" src="js/ChartPreLImg.js"></script>
  1257. <script LANGUAGE="JavaScript" src="js/SNMPInstances.js"></script>
  1258.  
  1259. <script LANGUAGE="JavaScript" FOR="window" EVENT="onresize()">
  1260. <!--
  1261.  top.banner.savePageCoord(event,document.body,'AnalyzeCharts');
  1262.  processSizeChange();
  1263. //-->
  1264. </script>
  1265.  
  1266. <script LANGUAGE="JavaScript" src="js/PopUpMenuFunc.js"></script>
  1267.  
  1268. <!-- Invisible Object to Support Simulated Click Event -->
  1269. <button id="FakeBut" style="display:none" onclick="top.banner.savePageCoord(event,document.body,'AnalyzeCharts')"></button>
  1270.  
  1271. <!-- Insure Object Control is Loaded and Installed -->
  1272. <object id="PrimaryGraphObj" CLASSID="clsid:D8C8B275-CB6A-11D2-9BAD-204C4F4F5020" onerror="ChartObjectError()"
  1273. CODEBASE="controls/RpmGraph.cab#version=5,0,0,9" style="display:none"></object>
  1274.  
  1275. <!-- Chart Display Area -->
  1276. <div id="MainDiv">
  1277.  
  1278.  <table id="DivTitle" border="1"  borderColor="activeborder" align="left">
  1279.     <tr><td borderColorDark="graytext" borderColorLight="white" style="font-weight:800; font-size:12pt; background-color:threedhighlight; color:windowtext"> <img src="images/sViewCharts.gif" align="absmiddle" height="16" width="16"> CounterWatch Graphs </td></tr>
  1280.  </table><BR CLEAR=ALL>
  1281.  
  1282. <center><div class="WarningStyle" id="WarningBox"><table border="0" cellpadding="0" cellspacing="2" width="90%">
  1283.   <tr>
  1284.     <td width="43"><img src="images/HourGlass.gif" width="32" height="32" alt="Please Wait!" align="bottom" border="0"></td>
  1285.     <td style="font-family:Arial; font-size:10pt; font-weight:bold; color:infotext">Please Wait While Chart Component Completes Loading!</td>
  1286.   </tr>
  1287. </table>
  1288. </div></center>
  1289. <table id="HelpText" border="0" cellpadding="0" cellspacing="0" width="600" height="86">
  1290.    <tr>
  1291.     <td class="inputlabel" width="600" height="25">
  1292.       <ul>
  1293.         <li>
  1294.           Press the 'New' button to create a new
  1295.           chart, or press the 'Open' button for a dialogue box where you can select
  1296.           from among your saved charts
  1297.         </li>
  1298.         <li>
  1299.           Add a Counter to the chart from the Tree
  1300.           view at left by clicking the Counter name to select it; then press the
  1301.           'Add' button.  A maximum of 16 Counters per chart can be added 
  1302.         </li>
  1303.         <li>
  1304.           Use the 'Wizard' button and 'Tune' button to
  1305.           configure the selected chart, then press the 'Save' button to save the
  1306.           chart settings; Right-click on a selected chart to pop-up a menu with the
  1307.           same function choice as the button bar
  1308.         </li>
  1309.         <li>
  1310.           In the Tree view at left:<br>
  1311.            (Click the 'Tree' button below to toggle the Tree view off/on)
  1312.           <ul type="square">
  1313.             <li>
  1314.               Expand the Groups, Servers/Devices, and Objects; hover with the mouse over Counter
  1315.               names to see a description in a pop-up tool tip; for SNMP Counters,
  1316.               the description also contains the 'Instance' and 'Syntax' information
  1317.               for the Counter
  1318.             </li>
  1319.             <li>
  1320.               Right-click with the mouse on a Counter
  1321.               name for a pop-up menu; the 'Summary' will provide a summary of
  1322.               all the monitored values in the database for the Counter; 
  1323.               for SNMP Counters the menu contains 'Get' and 'Set' commands
  1324.             </li>
  1325.             <li>
  1326.               For SNMP Table entries, distinguished in the Tree with the empty meter icon,
  1327.               the menu contains an 'Add Instance'; choose 'Add Instance' to query the device 
  1328.               to determine the available 'Instances'
  1329.               where you can then select 'Instances' to add to the Tree for monitoring; the
  1330.               menu for these added 'Instances' contains a 'Delete Instance' to remove these
  1331.               Counters
  1332.             </li>
  1333.             <li>
  1334.               Right-click on the Server/Device name for
  1335.               a pop-up menu; select 'Property' to set the default 
  1336.               'Monitor Schedule' for all the associated Counters for this Server/Device
  1337.             </li>
  1338.             <li>
  1339.               Set the checkbox to the left of a
  1340.               Counter to start monitoring the Counter according to the 'Monitor Schedule'
  1341.               property for its associated Server/Device; go to 'Manage CounterWatch Monitoring' 
  1342.               for a summary view of all the Counters selected for monitoring
  1343.             </li>
  1344.           </ul>
  1345.         </li>
  1346.         <li>
  1347.           Click the 'question-mark' icon above-right for more Help on all the Chart and Tree features
  1348.         </li>
  1349.       </ul>
  1350.     </td>
  1351.    </tr>
  1352.  </table>
  1353. <!-- Button Display Area -->
  1354. <div id="ButtonDiv">
  1355.    <div class="ChButton" id="BgImg" style="background-color:activeborder"></div>
  1356.  
  1357.      <div class="ChButton" style="height:60; width:186" id="ChTreeButtons" >
  1358.         <button id="cTreeButton" btype="cTree" bdis="0" style="position:absolute; left:4; top:2; cursor:hand" onclick="processChartButton('Tree')"  title="Press to Toggle Tree View"><img src="images/treehideshow.gif" height="18" width="19"></button>
  1359.         <button id="cToggleButton" btype="cTree" bdis="0" style="position:absolute; left:6; top:30; cursor:hand" onclick="processBannerMenu()" title="Press to Toggle Hide/Show of Menu and Banner Frames"><img src="images/FullView.gif" align="absmiddle" height="16" width="16"></button>
  1360.     </div>
  1361.  
  1362.      <div class="ChButton" style="height:14; width:186; display:none" id="ChTreeButtonsH" >
  1363.         <button id="cTreeButtonH" btype="cTree" bdis="0" style="position:absolute; left:4; top:1; cursor:hand" onclick="processChartButton('Tree')"  title="Press to Toggle Tree View"><img src="images/treehideshow.gif" height="13" width="13"></button>
  1364.         <button id="cToggleButtonH" btype="cTree" bdis="0" style="position:absolute; left:32; top:1; cursor:hand" onclick="processBannerMenu()" title="Press to Toggle Hide/Show of Menu and Banner Frames"><img src="images/FullView.gif" align="absmiddle" height="13" width="13"></button>
  1365.         <button id="cNewButtonH" style="position:absolute; left:60; top:1; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" btype="cNew" bdis="1" onclick="processChartButton('New')"   title="Press for New Chart" disabled><img src="images/NewImg.gif" align="absmiddle" height="13" width="13"></button>
  1366.         <button id="cOpenButtonH" style="position:absolute; left:88; top:1; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" btype="cOpen" bdis="1" onclick="processChartButton('Open')" title="Press to Open Existing Chart" disabled><img src="images/OpenImg.gif" align="absmiddle" height="13" width="13"></button>
  1367.         <button id="cPlayButtonH" style="position:absolute; left:116; top:1; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" btype="cPlay" bdis="1" onclick="processChartButton('Play')"  title="Press to Play Selected Chart" disabled><img id="cPlayImgH" src="images/PlayImg.gif" align="absmiddle" height="13" width="13"></button>
  1368.         <button id="cStopButtonH" style="position:absolute; left:144; top:1; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" btype="cStop" bdis="1" onclick="processChartButton('Stop')"  title="Press to Stop Selected Chart" disabled><img id="cStopImgH" src="images/StopImg.gif" align="absmiddle" height="13" width="8"></button>
  1369.         <button id="cPipButtonH" style="position:absolute; left:167; top:1; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" btype="cPip" bdis="1" onclick="processPIPToggle(this)"  title="Press to Toggle PIP Mode" disabled><img id="cPipImgH" src="images/PipImg.gif" align="absmiddle" height="13" width="13"></button>
  1370.     </div>
  1371.  
  1372.     <div class="ChButton" style="height:60; width:248" id="ChCtrlButtons" >
  1373.         <button id="cNewButton" style="position:absolute; left:4; top:2" btype="cNew" bdis="1" onclick="processChartButton('New')"  style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/NewImg.gif" align="absmiddle" height="14" width="13"> New</button>
  1374.         <button id="cOpenButton" style="position:absolute; left:68; top:2" btype="cOpen" bdis="1" onclick="processChartButton('Open')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/OpenImg.gif" align="absmiddle" height="14" width="15">Open</button>
  1375.         <button id="cCloseButton" style="position:absolute; left:132; top:2" btype="cClose" bdis="1" onclick="processChartButton('Close')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/CloseImg.gif" align="absmiddle" height="14" width="15">Close</button>
  1376.         <button id="cSaveButton" style="position:absolute; left:196; top:2" btype="cSave" bdis="1" onclick="processChartButton('Save')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/sSave.gif" align="absmiddle" height="15" width="15">Save</button>
  1377.         <button id="cAddButton" style="position:absolute; left:4; top:30" btype="cAdd" bdis="1" onclick="processChartButton('Add')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/AddImg.gif" align="absmiddle" height="14" width="14"> Add</button>
  1378.         <button id="cConfigButton" style="position:absolute; left:68; top:30" btype="cConfig" bdis="1" onclick="processChartButton('Config')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/ConfigImg.gif" align="absmiddle" height="14" width="15">Wizard</button>
  1379.         <button id="cDelButton" style="position:absolute; left:132; top:30" btype="cDel" bdis="1" onclick="processChartButton('Del')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/DelImg.gif" align="absmiddle" height="14" width="14">Delete</button>
  1380.         <button id="cExpButton" style="position:absolute; left:196; top:30" btype="cExp" bdis="1" onclick="processChartButton('Exp')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/DataSave.gif" align="absmiddle" height="14" width="14">Export</button>
  1381.     </div>
  1382.  
  1383.     <div class="ChButton" style="height:50; width:264" id="ChVCRButtons" >
  1384.         <img id="cSepLong1" style="position:absolute; left:4; top:4" height="48" width="20">
  1385.         <button id="cRevButton" style="position:absolute; left:26; top:2" btype="cRev" bdis="1" onclick="processChartButton('Rev')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img id="cRevImg" src="images/RevImg.gif" align="absmiddle" height="14" width="14"> Rev</button>
  1386.         <button id="cStopButton" style="position:absolute; left:90; top:2" btype="cStop" bdis="1" onclick="processChartButton('Stop')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img id="cStopImg" src="images/StopImg.gif" align="absmiddle" height="14" width="8"> Stop <img id="cStopImg1" src="images/StopImg.gif" align="absmiddle" height="14" width="8"></button>
  1387.         <button id="cPlayButton" style="position:absolute; left:154; top:2" btype="cPlay" bdis="1" onclick="processChartButton('Play')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled>Play <img id="cPlayImg" src="images/PlayImg.gif" align="absmiddle" height="14" width="14"></button>
  1388.         <button id="cFRButton" style="position:absolute; left:26; top:30" btype="cFR" bdis="1" onclick="processChartButton('FR')" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img id="cFRImg" src="images/FRImg.gif" align="absmiddle" height="14" width="25">  FR</button>
  1389.         <button id="cFineTuneButton" style="position:absolute; left:90; top:30" btype="cFineTune" bdis="1" onclick="processChartButton('FineTune')"  style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img id="cFineTuneImg" src="images/TuneImg.gif" align="absmiddle" height="14" width="14">Tune</button>
  1390.         <button id="cFFButton" style="position:absolute; left:154; top:30" btype="cFF" bdis="1" onclick="processChartButton('FF')"  style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled>FF <img id="cFFImg" src="images/FFImg.gif" align="absmiddle" height="14" width="27"></button>
  1391.         <img id="cSepLong2" style="position:absolute; left:216; top:4" height="48" width="20">
  1392.     </div>
  1393.  
  1394.     <div class="ChButton" style="height:60; width:128" id="ChScrollButtons" >
  1395.         <button id="cPipButton" style="position:absolute; left:4; top:2" btype="cPip" bdis="1" onclick="processPIPToggle(this)" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img id="cPipImg" src="images/PipImg.gif" align="absmiddle" height="14" width="14"> PIP</button>
  1396.         <button id="cSwapButton" style="position:absolute; left:68; top:2" btype="cSwap" bdis="1" onclick="processSelectChart()" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/SwapImg.gif" align="absmiddle" height="14" width="14"> Swap</button>
  1397.         <button id="cNextButton" style="position:absolute; left:4; top:30" btype="cNext" bdis="1" onclick="processScrollChart(true)" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/PlayImg.gif" align="absmiddle" height="14" width="14"> Next</button>
  1398.         <button id="cPrevButton" style="position:absolute; left:68; top:30" btype="cPrev" bdis="1" onclick="processScrollChart(false)" style="width:60px; height:24px; font-family:arial; font-size : 8pt; font-weight : 600; cursor:hand" disabled><img src="images/RevImg.gif" align="absmiddle" height="14" width="14"> Prev</button>
  1399.     </div>
  1400.  
  1401. </div>
  1402.  
  1403. <!-- Chart Manager:  Dynamically Added <Option> tags represent Charts -->
  1404. <select id="ChartMgr" style="display:none"></select>
  1405. </body>
  1406. </html>
  1407.